package xyz.bali16.module.netdisk.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import xyz.bali16.application.core.enums.ApiEnum;
import xyz.bali16.application.core.model.Result;
import xyz.bali16.module.netdisk.entity.FileUser;
import xyz.bali16.module.netdisk.model.fileuser.FileUserAddParam;
import xyz.bali16.module.netdisk.model.fileuser.FileUserPageParam;
import xyz.bali16.module.netdisk.model.fileuser.FileUserUpdateParam;


import javax.validation.Valid;
import java.util.List;
import java.util.Map;

import static xyz.bali16.application.core.model.Result.*;

/***
 * 我们来做一个约定
 * 系统用户sysuser_id:0 为系统用户
 * 文件用户fileuser_id:0 为文件用户
 * 系统文件 系统目录 都挂靠在user_id为0的系统用户
 * 而文件仓库 fileUser_id:0 为系统仓库
 * 而文件目录 fileFolder_id:0 为系统目录
 *
 * 文件用户规约
 * 前1024都为系统保留用户
 * 1024才为自动更新的
 * 同时, 如果文件用户的系统用户为0 则为内部文件用户
 * id:80 文件用户提供给博客图床服务,使用仓库为80,文件夹80,父文件夹0
 *
 * 看来我需要写一个创建系统服务的网盘接口(同时生成文件用户/仓库/文件夹,默认id都为相同)
 */

@RestController
@RequestMapping(BaseController.API+"fileuser")
public class FileUserController extends NetdiskBaseController {


    @GetMapping
    @ApiOperation("文件仓库列表数据")
    //@PreAuthorize("@auth.permission('plugin:netdisk:fileuser:query')")
    public Result<IPage<FileUser>> list(FileUserPageParam param) {
        IPage<FileUser> fileUserIPage = fileUserService.getPage(param);
        return success(ApiEnum.GET_SUCCESS, fileUserIPage);
    }

    @PostMapping
    @ApiOperation("添加文件用户")
    //@PreAuthorize("@auth.permission('plugin:netdisk:fileuser:add')")
    public Result<String> add(@RequestBody @Valid FileUserAddParam param) {
        try {
            fileUserService.add(param);
            return response(ApiEnum.ADD_SUCCESS);
        } catch (Exception e) {
            return failure(ApiEnum.ADD_ERROR, "新增文件用户失败", e);
        }
    }

    @PutMapping
    @ApiOperation("修改文件用户")
    //@PreAuthorize("@auth.permission('plugin:netdisk:fileuser:update')")
    public Result<String> update(@RequestBody @Valid FileUserUpdateParam param) {
        try {
            fileUserService.update(param);
            return response(ApiEnum.UPDATE_SUCCESS);
        } catch (Exception e) {
            return failure(ApiEnum.UPDATE_ERROR, "更新标签失败", e);
        }
    }

    @DeleteMapping("/{fileUserId}")
    @ApiOperation("删除文件用户")
    @ApiImplicitParam(name = "fileUserId", value = "文件用户id", paramType = "path", required = true)
    //@PreAuthorize("@auth.permission('plugin:netdisk:fileuser:delete')")
    public Result<String> delete(@PathVariable("fileUserId") String fileUserId) {
        try {
            fileUserService.delete(fileUserId);
            return response(ApiEnum.DELETE_SUCCESS);
        } catch (Exception e) {
            return failure(ApiEnum.DELETE_ERROR, e);
        }
    }
}
